import Module from "./module";
import { forEachValue } from "../utils";
export default class ModuleCollection {
  constructor(rawRootModule) {
    // 注册模块 rawRootModule:options
    this.register([], rawRootModule); // [] stack 栈
  }
  get(path) {
    return path.reduce((module, key) => {
      return module.getChild(key);
    }, this.root);
  }
  register(path, rawModule) {
    // dfs
    const newModule = new Module(rawModule);
    if (path.length === 0) {
      // 根模块
      this.root = newModule;
    } else {
      const parent = this.get(path.slice(0, -1));
      parent.addChild(path[path.length - 1], newModule);
    }
    // 如果有modules 注册子模块
    if (rawModule.modules) {
      // 循环递归
      forEachValue(rawModule.modules, (rawChildModule, key) => {
        this.register(path.concat(key), rawChildModule);
      });
    }
  }
  getNamespace(path) {
    let module = this.root;
    return path.reduce((namespace, key) => {
      module = module.getChild(key);
      return namespace + (module.namespaced ? key + "/" : "");
    }, "");
  }
}
